#!/bin/bash

# 创建临时用户并设置90天使用期限的脚本
# 使用方法: sudo ./create_temp_user.sh <用户名> [可选: 用户组]

set -e

# 检查是否以root权限运行
if [ "$(id -u)" -ne 0 ]; then
    echo "错误: 此脚本必须以root权限运行" >&2
    exit 1
fi

# 检查参数
if [ $# -lt 1 ]; then
    echo "用法: $0 <用户名> [用户组]" >&2
    exit 1
fi

USERNAME=$1
GROUP=${2:-users}  # 如果没有指定组，默认使用users组

# 检查用户是否已存在
if id "$USERNAME" &>/dev/null; then
    echo "错误: 用户 '$USERNAME' 已存在" >&2
    exit 1
fi

# 检查组是否存在
if ! getent group "$GROUP" >/dev/null; then
    echo "错误: 组 '$GROUP' 不存在" >&2
    exit 1
fi

# 计算90天后的日期
if date --version &>/dev/null; then
    # GNU date (Linux)
    EXPIRY_DATE=$(date -d "+90 days" +%Y-%m-%d)
else
    # BSD date (macOS)
    EXPIRY_DATE=$(date -v+90d +%Y-%m-%d)
fi

# 创建用户
echo "正在创建用户 '$USERNAME'，隶属于组 '$GROUP'，有效期至 $EXPIRY_DATE..."
useradd -m -g "$GROUP" -s /bin/bash -e "$EXPIRY_DATE" "$USERNAME"

# 生成随机密码
PASSWORD=$(openssl rand -base64 12)
echo "$USERNAME:$PASSWORD" | chpasswd

# 设置密码过期策略
chage -M 90 "$USERNAME"

# 创建用户信息文件
USER_INFO_FILE="/home/$USERNAME/账户信息.txt"
cat > "$USER_INFO_FILE" << EOF
账户信息
========
用户名: $USERNAME
密码: $PASSWORD
账户有效期至: $EXPIRY_DATE

使用说明:
1. 首次登录后请立即修改密码
2. 账户将在 $EXPIRY_DATE 后自动过期
3. 过期后账户将被禁用，但文件会保留30天

注意事项:
- 请妥善保管您的密码
- 请勿与他人共享账户
- 请遵守系统使用规定
EOF

# 设置文件权限
chown "$USERNAME:$GROUP" "$USER_INFO_FILE"
chmod 600 "$USER_INFO_FILE"

# 创建过期提醒脚本
cat > "/usr/local/bin/check_user_expiry_$USERNAME.sh" << 'EOF'
#!/bin/bash
USERNAME="$1"
EXPIRY_DATE="$2"
TODAY=$(date +%Y-%m-%d)

# 计算剩余天数
if date --version &>/dev/null; then
    # GNU date
    DAYS_LEFT=$(( ($(date -d "$EXPIRY_DATE" +%s) - $(date -d "$TODAY" +%s)) / 86400 ))
else
    # BSD date
    DAYS_LEFT=$(( ($(date -j -f "%Y-%m-%d" "$EXPIRY_DATE" +%s) - $(date -j -f "%Y-%m-%d" "$TODAY" +%s)) / 86400 ))
fi

# 提前7天开始提醒
if [ "$DAYS_LEFT" -le 7 ] && [ "$DAYS_LEFT" -gt 0 ]; then
    echo "警告: 您的账户将在 $DAYS_Left 天后过期 ($EXPIRY_DATE)" | write "$USERNAME"
elif [ "$DAYS_LEFT" -le 0 ]; then
    echo "您的账户已过期，将被禁用" | write "$USERNAME"
    # 禁用账户
    usermod -L "$USERNAME"
    # 安排30天后删除用户
    echo "userdel -r $USERNAME" | at now + 30 days
fi
EOF

chmod +x "/opt/check_user_expiry_$USERNAME.sh"

# 添加到cron每日检查
(crontab -l 2>/dev/null; echo "0 9 * * * /usr/local/bin/check_user_expiry_$USERNAME.sh $USERNAME $EXPIRY_DATE") | crontab -

# 输出创建信息
echo "================================================"
echo "临时用户创建成功!"
echo "用户名: $USERNAME"
echo "密码: $PASSWORD"
echo "账户有效期至: $EXPIRY_DATE"
echo "用户组: $GROUP"
echo "家目录: /home/$USERNAME"
echo "账户信息文件: $USER_INFO_FILE"
echo "================================================"
echo "请将上述信息提供给用户，并提醒用户首次登录后修改密码"